package com.example.interesting.distributed.lock.realize.aop;

import com.example.interesting.distributed.lock.realize.annotation.DistributedLockAnnotation;
import org.aopalliance.aop.Advice;
import org.springframework.aop.Pointcut;
import org.springframework.aop.support.AbstractPointcutAdvisor;

/**
 * @author fyw
 * @version 1.0
 * @description: AbstractPointcutAdvisor 是 Spring AOP 框架中的一个抽象类，它实现了 PointcutAdvisor 接口，用于创建切面通知器（Advisor）。
 * 主要功能
 * 切面配置：AbstractPointcutAdvisor 用于配置切面，并且允许我们指定切入点（Pointcut）、通知（Advice）类型以及其他相关信息。
 * 通知器的创建：作为一个抽象类，它提供了基本实现并预留了一些方法和属性，以便子类可以在其基础上构建自定义的切面通知器。
 * @date 2024/3/10 14:11
 */
public class LockAop extends AbstractPointcutAdvisor {


    private final Pointcut pointcut = new DistributedLockAnnotationPoint(DistributedLockAnnotation.class);

    private final Advice advice;

    public LockAop(final LockMethodInterceptor lockMethodInterceptor,int order) {
        this.advice = lockMethodInterceptor;
        setOrder(order);
    }

    /**
     * 获取切点---制定要拦截的切点
     *
     * @return
     */
    @Override
    public Pointcut getPointcut() {
        return this.pointcut;
    }

    /**
     * 获取切面的通知----拦截后具体执行的逻辑
     *
     * @return
     */
    @Override
    public Advice getAdvice() {
        return this.advice;
    }


}
